#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,n,m,L,v,d,V,a,p[3020],pf[3020],gf[3020];
pair<int,int> f[3020];
signed main(){
	freopen("detect.in","r",stdin);
	freopen("detect.out","w",stdout);
	scanf("%lld",&t);
	while(t--){
		vector<int> g[3020],cur,cnt[3020];
		scanf("%lld%lld%lld%lld",&n,&m,&L,&V);
		int ans1=0,ans2=0;
		memset(pf,0,sizeof pf);
		memset(gf,0,sizeof gf);
		for(int i=1;i<=n;i++){
			scanf("%lld%lld%lld",&d,&v,&a);
			f[i].first=L;
			f[i].second=0;
			if(a>0){
				if(v>V){
					f[i].first=d;
					f[i].second=L;
					continue;
				}
				int x=(V*V-v*v)/(2*a)+1;
				f[i].first=d+x;
				f[i].second=L;
			}
			if(a<0){
				if(v<=V) continue;
				int x=(v*v-V*V)/(-2*a)+((v*v-V*V)%(-2*a)==0?0:1);
				f[i].first=d;
				f[i].second=min(L,d+x-1);
			}
			if(a==0){
				if(v<=V) continue;
				f[i].first=d;
				f[i].second=L;
			}
		}
		for(int i=1;i<=m;i++) scanf("%lld",&p[i]);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++) if(f[i].first<=p[j]&&p[j]<=f[i].second) g[i].push_back(j),cnt[j].push_back(i);
			if((int)g[i].size()>0) ans1++;
		}
		printf("%lld ",ans1);
		int tot=ans1;
		for(int i=1;i<=n;i++)
			if(g[i].size()==1) pf[g[i][0]]=1,cur.push_back(g[i][0]);
		for(int i=0;i<(int)cur.size();i++)
			for(int j=0;j<(int)cnt[cur[i]].size();j++)
				if(!gf[cnt[cur[i]][j]]) gf[cnt[cur[i]][j]]=1,tot--;
		while(tot){
			int maxn=0,maxi=0;
			for(int i=1;i<=m;i++){
				if(pf[i]) continue;
				int tem=0;
				for(int j=0;j<(int)cnt[i].size();j++) if(!gf[cnt[i][j]]) tem++;
				if(tem>maxn) maxn=tem,maxi=i;
			}
			pf[maxi]=1;
			for(int i=0;i<(int)cnt[maxi].size();i++) if(!gf[cnt[maxi][i]]) gf[cnt[maxi][i]]=1,tot--;
		}
		for(int i=1;i<=m;i++) ans2+=pf[i];
		printf("%lld\n",m-ans2);
	}	
	return 0;
}
